<?php
/**
 * Mysql
 *
 * @package php.db
 */

/**
 * Mysql 연결 클래스 
 *
 * @package php.db
 */
class Mysql extends DBClient {

	/**
	 * 생성자
	 *
	 */
	public function __construct($option = '', $type = 'product') {
		parent::__construct($option, $type);
	}

	/**
	 * database 연결 생성
	 * 
	 * @return resource 연결 resource
	 */
	protected function _connect() { 

		$connection = mysql_connect(sprintf("%s:%s", $this->host, $this->port), $this->id, $this->pass, $this->newlink);

		$selected	= mysql_select_db($this->db, $connection);

		return ($connection && $selected) ? $connection : false;
	}

	/**
	 * 기본 속성 이외의 다른속성 실행할 때 
	 * 
	 * 
	 * @see lib/php/db/DBClient#runOption()
	 */
	public function runOption() { 
		// 인코딩 설정 
		if ($this->encoding) { 
			$this->setEncoding($this->encoding);
		}
	}

	/** 
	 * DB 선택하기 
	 */
	public function selectDB($db_name) { 
		return mysql_select_db($db_name, $this->getConnection());
	}

	/**
	 * 실행된 row 수 
	 *
	 * @return int 
	 */
	public function affectedRows() { 
		return mysql_affected_rows($this->getConnection());
	}

	/**
	 * 트랜잭션 시작 
	 * 
	 * @return bool 
	 * @see Mysql::commit(), Mysql::rollback();
	 */
	public function begin() { 
		$this->query('set autocommit=0');
	}

	/**
	 * 연결 닫기 
	 */
	public function close()
	{
		mysql_close($this->getConnection());
	}

	/** 
	 * commit 
	 *
	 * mssql은 자동으로 commit을 하기 때문에 자동commit 을 하지 않을려면 반드시 begin() 메소드를 먼저 실행해야한다.
	 * 
	 * @return bool
	 * @see Mysql::begin(), Mysql::rollback();
	 */
	public function commit() { 
		$this->query('commit');
	}


	/**
	 * 에러 메세지 리턴
	 * 
	 * @return string 에러 메세지 
	 */	
	public function error() {
		return mysql_error();
	}

	/**
	 * 문자열 escape	
	 * 
	 * @param string $str  escape 될 문자열 
	 * @return string escape 된 문자열
	 */
	public function escape($str) { 
		return mysql_real_escape_string($str);
	}

	/**
	 * 실행된 select 쿼리에 대해서 fetch 를 통해 한 행(row)을 리턴한다. 
	 *
	 * 리턴되는 값은 array('필드' => 'ㅁㅁㅁ', ...); 형태를 가진다. 
	 * 
	 * @param resource $result select 결과로 나온 resource
	 * @return array row 데이타 
	 */
	public function fetch($result) {
		return mysql_fetch_assoc($result);
	}

	/** 
	 * 메모리 해제 
	 * 
	 * @return bool
	 */
	public function free($result) {
		return mysql_free_result($result);
	}

	/**
	 * 클라이언트 인코딩을 얻어온다. 
	 *
	 * @return string 인코딩값, ex) utf8, euckr, latin1, ...
	 */
	public function getClientEncoding() { 
		return mysql_client_encoding($this->getConnection());
	}


	/**
	 * 쿼리의 결과로 나온 필드의 개수를 리턴한다.
	 *
	 * @param resource $result select 결과로 나온 resource
	 * @return int 필드개수 
	 */
	public function getFieldCount($result) {
		return mysql_num_fields($result);
	}

	/**
	 * 정해진 위치의 필드 이름을 얻어온다. 
	 *
	 * @param resource $result select 결과로 나온 resource
	 * @param int $i 필드 위치, 처음은 0 
	 * @return string 필드이름 
	 */
	public function getFieldName($result, $i) {
		return mysql_field_name($result, $i);
	}

	/**
	 * 정해진 위치의 필드 타입을 얻어온다. 
	 *
	 * @param resource $result select 결과로 나온 resource
	 * @param int $i 필드 위치, 처음은 0 
	 * @return string 필드타입
	 */
	public function getFieldType($result, $i) {
		return mysql_field_type($result, $i);
	}

	function getInsertId() { 
		return mysql_insert_id($this->getConnection());
	}

	/**
	 * select 쿼리에 대해서 페이징된 DBData를 리턴한다. 
	 *
	 * @param string $query select 쿼리
	 * @param int $page 현재 페이지  
	 * @param int $count 페이지당 리스트 개수 
	 * @param string $baseClass  DBData 를 상속한 클래스 , 기본값 DBData  
	 * @return DBData
	 */
	function getPageData($query, $page = 1, $count = 10)
	{
		// 시작지점 계산하기 
		$start = ($page-1)*$count;

		$query .= " limit $start, $count";

		return $this->getData($query, false);
	}

	/**
	 * 필드 타입(자료형)별 DB에 입력될 수 있는 문자열 얻어오기 
	 *
	 * @param string $type 타입문자열 
	 * @param mixed $value 입력값
	 * @param boolean $is_null 널을 체크할 것인지 여부 , true 널체크, false 널 체크 안함 
	 * @return string 변환된 문자열
	 */
	public function getTypeString($type, $value, $is_null = false) { 
		$type = strtolower($type);

		switch ($type) {
			case 'bit':
				$temp = sprintf("B'%b'", $value);
				break;
			case 'bigint':
			case 'bool':
			case 'boolean':
			case 'int':
			case 'integer':
			case 'mediumint':
			case 'smallint':
			case 'tinyint':
				$temp = intval($value);
				break;
			case 'dec':
			case 'decimal':
			case 'double precision':
			case 'double':
			case 'float':
				$temp = floatval($value);
				break;
			case 'date' :
			case 'datetime' :
			case 'time' :
			case 'timestamp' :
			case 'year' :
				$temp = sprintf("'%s'", $this->escape($value));
				break;
			case 'binary':
			case 'blob':
			case 'char':
			case 'enum':
			case 'longblob':
			case 'longtext':
			case 'mediumblob':
			case 'mediumtext':
			case 'national char':
			case 'nchar':
			case 'set':
			case 'text':
			case 'tinyblob':
			case 'tinytext':
			case 'varchar':
			case 'varbinary':
				$temp = sprintf("'%s'", $this->escape($value));
				break;
			default: 
				$temp = $value;
				break;
		}

		return ($is_null && is_null($value)) ? 'NULL' : $temp;
	}

	/** 
	 * 일반 쿼리 실행 
	 * 
	 * @param string $sql 실행될 query 
	 * @return resource 실행 resource
	 */
	public function query($sql) {
		$this->addSql($sql);

		$this->setResult(mysql_query($sql, $this->getConnection()));
		return $this->getResult();
	}

	/** 
	 * rollback
	 *
	 * @return bool 
	 */
	public function rollback() { 
		$this->query('rollback');		
	}

	/**
	 * 커서 이동 
	 * 
	 * @param int $count 이동시킬 상대위치, 사직행은 0 
	 * @return bool
	 */
	public function seek($count) { 
		return mysql_data_seek($this->getResult(), $count);
	}

	/**
	 * 서버 인코딩을 설정한다.
	 * 
	 * @param $encoding string 인코딩타입, 기본값 utf8, 한글은 euckr
	 */
	public function setEncoding($encoding = "utf8") { 
		@$this->query("set names {$encoding}");
	}

	/**
	 * 구현안됨 
	 *
	 * @todo 미구현
	 */
	public function prepare() { 

	}

	/**
	 * 구현안됨 
	 *
	 * @todo 미구현
	 */
	public function bind() { 

	}

	/**
	 * 구현안됨 
	 *
	 * @todo 미구현
	 */
	public function execute() { 

	}

}

?>